#include "vtor_i2c.h"

// 加入用户工程宏
#ifdef __DEMO_PROJECT__
#include "main.h"

VtorI2c vtorI2cSlaveArray[2] = {0};
VtorI2c* slaveI2c = NULL;


void VtorI2cSlave_WriteSda(VtorI2c* i2c, uint8_t level)
{
	if(i2c == slaveI2c)
	{
		HAL_GPIO_WritePin(I2C_SLAVE_SDA_GPIO_Port, I2C_SLAVE_SDA_Pin, level);
	}
}

uint8_t VtorI2cSlave_ReadScl(VtorI2c* i2c)
{
	if(i2c == slaveI2c)
	{
		return HAL_GPIO_ReadPin(I2C_SLAVE_SCL_GPIO_Port, I2C_SLAVE_SCL_Pin);
	}
}

uint8_t VtorI2cSlave_ReadSda(VtorI2c* i2c)
{
	if(i2c == slaveI2c)
	{
		return HAL_GPIO_ReadPin(I2C_SLAVE_SDA_GPIO_Port, I2C_SLAVE_SDA_Pin);
	}
}

void VtorI2cSlave_SetSdaDir(VtorI2c* i2c, uint8_t dir)
{
	if(i2c == slaveI2c)
	{
		GPIO_InitTypeDef GPIO_InitStruct = {0};
		GPIO_InitStruct.Pin = I2C_SLAVE_SDA_Pin;
		// 输出模式时，设置为开漏输出
		// 输入模式时，设置成边沿中断输入
		switch(dir)
		{
		case GPIO_DIR_OUTPUT:
			GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
			break;
		case GPIO_DIR_IT_2EDGE:
			GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
			break;
		default:
			GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		}
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
		HAL_GPIO_Init(I2C_SLAVE_SDA_GPIO_Port, &GPIO_InitStruct);
	}
}


void VtorI2cSlave_Init()
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};

	GPIO_InitStruct.Pull = GPIO_PULLUP;
	// cubemx初始化引脚时，需配置成input，因为slaveI2c指针还未初始化
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	// 如果是在VtorI2cSlave_Init函数内，将其初始化为上升沿和下降沿中断
	GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;

	GPIO_InitStruct.Pin = I2C_SLAVE_SCL_Pin;
	HAL_GPIO_Init(I2C_SLAVE_SCL_GPIO_Port, &GPIO_InitStruct);

	GPIO_InitStruct.Pin = I2C_SLAVE_SDA_Pin;
	HAL_GPIO_Init(I2C_SLAVE_SDA_GPIO_Port, &GPIO_InitStruct);

	VtorI2c* i2c = &vtorI2cSlaveArray[0];
	i2c->selfDevAddr = 0x6a;
	for(int i = 0; i < 10; i++)
	{
		//slaveI2c->regData[i] = 0xff;
		i2c->regData[i] = i % 10 + '0';
	}
	// 测试从机
    VtorI2cSlave_SetSdaDir(i2c, GPIO_DIR_IT_2EDGE);

	// 开启外部中断
	HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
	HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
	// 内部变量初始化完成后，再对指针进行赋值
	slaveI2c = i2c;
}

void VtorI2cSlave_StopCallback(VtorI2c* i2c)
{
	// VtorTimer_Create(VtorSlaveI2cTask, 0);
	// osMutexRelease(i2cMutex);
}

// 在对应的中断处理函数内，写好正确的中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if (GPIO_Pin == I2C_SLAVE_SCL_Pin)
	{
		VtorI2cSlave_SclHandler(slaveI2c);
	}
	if (GPIO_Pin == I2C_SLAVE_SDA_Pin)
	{
		VtorI2cSlave_SdaHandler(slaveI2c);
	}
}


#endif

